#!/bin/bash
# Filename     :        get_free_cert.sh
# Last modified:        2024-08-30 12:12
# Version      :
# Author       : jack.zang
# Email        : jack.zang@aishangwei.net
# Description  :
# 使用方法：source <(curl -sL https://gitee.com/jack_zang/public-scripts/raw/master/shell/docker/docker-install-ubuntu.sh)
# ******************************************************

# 设置证书名称和域名
DOMAIN_NAME="test3.xxxx.cn"
AK_KEY="xxx"
AK_SECRET="xxxx"

# 配置 aliyun cli
if !command -v aliyun &> /dev/null; then
    curl -O  https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
    tar xzvf aliyun-cli-linux-latest-amd64.tgz && mv aliyun /usr/local/bin/
fi

## 1. 配置 aliyun cli ak 凭证
if [ ! -f "$HOME/.aliyun/config.json" ]; then
    aliyun configure set --profile aliyun-ak --mode AK --region cn-hangzhou --access-key-id $AK_KEY --access-key-secret $AK_SECRET
else
    if ! grep -q "aliyun-ak" "$HOME/.aliyun/config.json"; then
        aliyun configure set --profile aliyun-ak --mode AK --region cn-hangzhou --access-key-id $AK_KEY --access-key-secret $AK_SECRET
    fi
fi
echo "[INFO]aliyun cli 版本为："`aliyun version`," AK 凭证配置成功"

# 计算两个日期之间的天数
function calc_day() {
    current_date=$(date +%Y-%m-%d)
    echo $((($(date -d "$1" +%s) - $(date -d "$current_date" +%s)) / 86400))
}

## 2. 获取证书状态
CHECK_STATUS=$(aliyun cas ListUserCertificateOrder --region cn-hangzhou --Keyword $DOMAIN_NAME --OrderType CERT)

for (( i=1; i<=3; i++ )); do
    if [[ $CHECK_STATUS == *CertificateOrderList* ]]; then
        echo "[INFO]获取域名：$DOMAIN_NAME 的 SSL 证书状态"
        echo $CHECK_STATUS
        break
    elif [[ $i -eq 3 ]]; then
        echo "[ERROR]已尝试 3 次获取域名：$DOMAIN_NAME 的 SSL 证书状态失败，退出..."
        exit 1
    else
        echo "[WARNING]获取域名：$DOMAIN_NAME 的 SSL 证书状态失败，正在第 $((i + 1)) 次尝试获取..."
        CHECK_STATUS=$(aliyun cas ListUserCertificateOrder --region cn-hangzhou --Keyword $DOMAIN_NAME --OrderType CERT)
    fi
done

## 3. 检查证书状态
STATUS=$(echo $CHECK_STATUS | jq -r '.CertificateOrderList.[0].Status')
expire_day=$(echo $CHECK_STATUS | jq -r '.CertificateOrderList.[0].EndDate')
case "$STATUS" in
    "ISSUED")
        echo "issued"    
        if [ -n "$expire_day" ]; then
            echo "woyijingqianfa"
            day_diff=$(calc_day $expire_day)
            echo $day_diff
            if [ $day_diff -gt 3 ]; then
                echo "[INFO]证书已经签发，有效期还有 $day_diff ，大于 3 天，证书申请退出..."
                exit 0
            fi
        fi
        ;;
    "CHECKING")
        echo "[INFO]证书因为未知原因正在审核中，无需再次申请，请手工进行后续操作，退出..."
        exit 1
        ;;
esac

## 4. 申请证书
echo "[INFO]开始为域名： $DOMAIN_NAME 申请一个免费证书"
aliyun cas CreateCertificateForPackageRequest --region cn-hangzhou --Domain $DOMAIN_NAME \
    --ProductCode 'digicert-free-1-free' --ValidateType DNS
    
for (( i=1; i<=3; i++ )); do
    if [ $? -eq 0 ]; then
        echo "[INFO]已申请证书，签发中，请等待 30s..."
        sleep 30
        break
    elif [ $i -eq 3 ]; then
        echo "[ERROR]已尝试 3 次申请域名：$DOMAIN_NAME 的 SSL 证书失败，退出..."
        exit 1
    else
        echo "[WARNING]申请证书失败，正在第 $((i + 1)) 次尝试申请..."
        aliyun cas CreateCertificateForPackageRequest --region cn-hangzhou --Domain $DOMAIN_NAME \
            --ProductCode 'digicert-free-1-free' --ValidateType DNS
    fi
done


# 安装 jq
if !command -v jq &> /dev/null; then
    apt install jq -y
fi

## 5. 等待一段时间让证书变为签发成功
echo "证书签发中， 请等待 60s ..."
sleep 60

## 6. 检查证书是否签发成功
CHECK_STATUS=$(aliyun cas ListUserCertificateOrder --region cn-hangzhou --Keyword $DOMAIN_NAME --Status ISSUED --OrderType CERT)
echo $CHECK_STATUS
STATUS=$(echo $CHECK_STATUS | jq -r '.CertificateOrderList.[0].Status')
while [ "$STATUS" != "ISSUED" ]; do
    echo "证书还未签发，继续等待 30s ..."
    sleep 30
    CHECK_STATUS=$(aliyun cas ListUserCertificateOrder --region cn-hangzhou --Keyword $DOMAIN_NAME --Status ISSUED --OrderType CERT)
    STATUS=$(echo $CHECK_STATUS | jq -r '.CertificateOrderList.[0].Status')
done
echo "$DOMAIN_NAME 证书已签发"

## 7. 获取证书并保存到当前目录
CERT_ID=$(echo $CHECK_STATUS | jq -r '.CertificateOrderList.[0].CertificateId')
CERT_KEY=$(aliyun cas GetUserCertificateDetail --region cn-hangzhou --CertId $CERT_ID --CertFilter false)
echo $CERT_KEY | jq -r '.Cert' > ${DOMAIN_NAME}.pem
echo $CERT_KEY | jq -r '.Key' > ${DOMAIN_NAME}.key